﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using DTO;
using System.Data.SqlClient;

namespace DAO
{
    public class DAO_ThanhVien
    {
        private DataServices data = new DataServices();
        private const string SELECT_ALL_THANHVIEN = 
                                    "SELECT " + DTO_ThanhVien.MATHANHVIEN + ","
                                           + DTO_ThanhVien.TENTHANHVIEN + ","
                                           + DTO_ThanhVien.NGAYSINH + ","
                                           + DTO_ThanhVien.DOI + ","
                                           + DTO_ThanhVien.TENTHANHVIEN + " as Parent"
                                  + " FROM " + DTO_ThanhVien.TB_Name;
        public DataTable getAllThanhVien()
        {
            DataTable tbThanhVien = new DataTable();
            try
            {
                tbThanhVien = data.executeGetDataTable(SELECT_ALL_THANHVIEN);
                loadGridViewThanhVien(tbThanhVien);
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message, ex) ;
            }
            return tbThanhVien;
        }
        public void loadGridViewThanhVien(DataTable table)
        {
            foreach (DataRow row in table.Rows)
            {
                String name = "";
                int id = Int16.Parse(row[0].ToString());
                SqlParameter p1 = new SqlParameter(DTO_ThanhVien.MATHANHVIEN, id);
                DataTable tableTemp = data.getDateTableFormProcedure("layTenChaMe", p1);
                if (tableTemp.Rows.Count > 0)
                {
                    for (int i = 0; i < tableTemp.Rows.Count; i++)
                    {
                        name += tableTemp.Rows[i][0] + " ,";
                    }
                }
                row[4] = name.Trim(',');
            }
        }

        public DataTable timKiemThanhVien(string name,bool? gioiTinh)
        {
            try
            {
                SqlParameter p2 = null;
                DataTable table = new DataTable();
                String sql = SELECT_ALL_THANHVIEN + " WHERE " + DTO_ThanhVien.TENTHANHVIEN + " LIKE @" + DTO_ThanhVien.TENTHANHVIEN;
                SqlParameter p1 = new SqlParameter(DTO_ThanhVien.TENTHANHVIEN, "%" + name + "%");
                if (gioiTinh != null)
                {
                    sql += " AND " + DTO_ThanhVien.GIOITINH + " = @" + DTO_ThanhVien.GIOITINH;
                    p2 = new SqlParameter(DTO_ThanhVien.GIOITINH, gioiTinh);
                    table = data.executeGetDataTable(sql, p1, p2);
                }
                else
                {
                    table = data.executeGetDataTable(sql, p1);
                }
               
               
                loadGridViewThanhVien(table);
                return table;
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message, ex);
            }
        }

        public int addThanhVien(DTO_ThanhVien tv)
        {
            bool result = false;
            int maxId = 0;
            try
            {
                String sql = "insertThanhVien";
                SqlParameter paramTenTV = new SqlParameter(DTO_ThanhVien.TENTHANHVIEN, checkNull(tv.TenTV));
                SqlParameter paramDiaChi = new SqlParameter(DTO_ThanhVien.DIACHI, checkNull(tv.DiaChi));
                SqlParameter paramNgaySinh = new SqlParameter(DTO_ThanhVien.NGAYSINH, checkNull(tv.NgaySinh));
                SqlParameter paramDoi = new SqlParameter(DTO_ThanhVien.DOI, checkNull(tv.Doi));
                SqlParameter paramNgayPhatSinh = new SqlParameter(DTO_ThanhVien.NGAYPHATSINH, checkNull(tv.NgayPhatSinh));
                SqlParameter paramMaNgheNghiep = new SqlParameter(DTO_ThanhVien.MANGHENGHIEP,checkNull( tv.MaNgheNghiep));
                SqlParameter paramMaQueQuan = new SqlParameter(DTO_ThanhVien.MAQUEQUAN, checkNull(tv.MaQueQuan));
                SqlParameter paramMaDDMaiTang = new SqlParameter(DTO_ThanhVien.MADDMAITANG,checkNull( tv.MaDDMaiTang));
                SqlParameter paramMaNguyenNhan = new SqlParameter(DTO_ThanhVien.MANGUYENNHAN,checkNull( tv.MaNguyenNhan));
                SqlParameter paramGioiTinh = new SqlParameter(DTO_ThanhVien.GIOITINH,checkNull( tv.GioiTinh));
                SqlParameter paramHinhAnh = new SqlParameter(DTO_ThanhVien.HINHANH,checkNull( tv.HinhAnh));
                SqlParameter paramNgayGioMat = new SqlParameter(DTO_ThanhVien.NGAYGIOMAT, checkNull(tv.NgayGioMat));
                SqlParameter paramDaMat = new SqlParameter(DTO_ThanhVien.DAMAT,checkNull( tv.DaMat));
                SqlParameter paramDaKetHon = new SqlParameter(DTO_ThanhVien.DAKETHON, checkNull(tv.DaKetHon));

                result = data.updateFormProcedure(sql, paramTenTV,paramDiaChi,paramNgaySinh,paramDoi,
                                 paramNgayPhatSinh,paramMaNgheNghiep,paramMaQueQuan,paramMaDDMaiTang,
                                 paramMaNguyenNhan, paramGioiTinh, paramHinhAnh, paramNgayGioMat, paramDaMat, paramDaKetHon);

                if (result)
                {
                    DataTable tbGetMaxId = new DataTable();
                    tbGetMaxId = data.getDateTableFormProcedure("getMaxIdThanhVien");
                    if (tbGetMaxId.Rows.Count > 0)
                    {
                        maxId = Convert.ToInt16(tbGetMaxId.Rows[0][0]);
                    }
                }
                
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message,ex);
            }
            return maxId;
        }

        public DTO_ThanhVien getThanhVienById(int id)
        {
            DTO_ThanhVien tv = new DTO_ThanhVien();
            try
            {
                string sql = "SELECT * FROM " + DTO_ThanhVien.TB_Name 
                                   + " WHERE " + DTO_ThanhVien.MATHANHVIEN 
                                                    + " = @" + DTO_ThanhVien.MATHANHVIEN;
                SqlParameter p1 = new SqlParameter(DTO_ThanhVien.MATHANHVIEN, id);
                DataTable dt = data.executeGetDataTable(sql,p1);
                if (dt.Rows.Count > 0)
                {
                    tv.MaTV = Convert.ToInt16(dt.Rows[0][DTO_ThanhVien.MATHANHVIEN]);
                    tv.TenTV = dt.Rows[0][DTO_ThanhVien.TENTHANHVIEN].ToString();
                    tv.DiaChi = dt.Rows[0][DTO_ThanhVien.DIACHI].ToString();
                    tv.MaNgheNghiep = checkValue(dt.Rows[0][DTO_ThanhVien.MANGHENGHIEP]);
                    tv.MaQueQuan = checkValue(dt.Rows[0][DTO_ThanhVien.MAQUEQUAN]);
                    tv.MaDDMaiTang = checkValue(dt.Rows[0][DTO_ThanhVien.MADDMAITANG]);
                    tv.MaNguyenNhan = checkValue(dt.Rows[0][DTO_ThanhVien.MANGUYENNHAN]);
                    tv.HinhAnh = dt.Rows[0][DTO_ThanhVien.HINHANH].ToString();

                    if (!dt.Rows[0][DTO_ThanhVien.NGAYSINH].ToString().Equals(""))
                    {
                        tv.NgaySinh = Convert.ToDateTime(dt.Rows[0][DTO_ThanhVien.NGAYSINH]);
                    }

                    if (!dt.Rows[0][DTO_ThanhVien.DOI].ToString().Equals(""))
                    {
                        tv.Doi = Convert.ToInt16(dt.Rows[0][DTO_ThanhVien.DOI]);
                    }
                    else
                    {
                        tv.Doi = 1;
                    }

                    if (!dt.Rows[0][DTO_ThanhVien.NGAYPHATSINH].ToString().Equals(""))
                    {
                        tv.NgayPhatSinh = Convert.ToDateTime(dt.Rows[0][DTO_ThanhVien.NGAYPHATSINH]);

                    }

                    if (!dt.Rows[0][DTO_ThanhVien.GIOITINH].ToString().Equals(""))
                    {
                        tv.GioiTinh = Convert.ToBoolean(dt.Rows[0][DTO_ThanhVien.GIOITINH]);
                    }
                    else
                    {
                        tv.GioiTinh = false;
                    }

                    if (!dt.Rows[0][DTO_ThanhVien.NGAYGIOMAT].ToString().Equals(""))
                    {
                        tv.NgayGioMat = Convert.ToDateTime(dt.Rows[0][DTO_ThanhVien.NGAYGIOMAT]);
                    }

                    if (!dt.Rows[0][DTO_ThanhVien.DAMAT].ToString().Equals(""))
                    {
                        tv.DaMat = Convert.ToBoolean(dt.Rows[0][DTO_ThanhVien.DAMAT]);
                    }
                    else
                    {
                        tv.DaMat = false;
                    }

                    if (!dt.Rows[0][DTO_ThanhVien.DAKETHON].ToString().Equals(""))
                    {
                        tv.DaKetHon = Convert.ToBoolean(dt.Rows[0][DTO_ThanhVien.DAKETHON]);
                    }
                    else
                    {
                        tv.DaKetHon = false;
                    }
                    
                }
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message,ex);
            }
            return tv;
        }

        private int? checkValue(object obj)
        {
            try
            {
                if (obj == null || obj.Equals("-1"))
                {
                    return null;
                }
                return Convert.ToInt16(obj);
            }
            catch (Exception)
            {
                return null;
            }
        }
        private object checkNull(object obj){
            if (obj == null)
            {
                return DBNull.Value;
            }
            return obj;
        }

        public bool insertThanhVienQuanHe(List<DTO_ThanhVienQuanHe> list)
        {
            bool result = false;
            try
            {
                foreach (DTO_ThanhVienQuanHe tvqh in list)
                {
                    SqlParameter paramMaTVCu = new SqlParameter(DTO_ThanhVienQuanHe.MATVCU, checkNull(tvqh.MaTvCu));
                    SqlParameter paramMaTVMoi = new SqlParameter(DTO_ThanhVienQuanHe.MATVMOI, checkNull(tvqh.MaTvMoi));
                    SqlParameter paramMaLoaiQH = new SqlParameter(DTO_LoaiQuanHe.MAQUANHE, checkNull(tvqh.MaLoaiQH));
                    result = data.updateFormProcedure("insertThanhVienQuanHe", paramMaTVCu, paramMaTVMoi, paramMaLoaiQH);
                    if (tvqh.MaLoaiQH == 2) // quan hệ vợ chồng
                    {
                        // xóa những quan hệ vợ chồng cũ 
                        String sql = "DELETE FROM " + DTO_ThanhVienQuanHe.TB_NAME + " WHERE " + DTO_ThanhVienQuanHe.MATVCU + " = " + tvqh.MaTvMoi
                                        + " AND " + DTO_ThanhVienQuanHe.MATVMOI + "=" + tvqh.MaTvCu
                                        + " AND " + DTO_LoaiQuanHe.MAQUANHE + "=" + tvqh.MaLoaiQH;
                        data.executeUpdate(sql);

                        // cập nhật quan hệ vợ chồng hiện tại sau khi cập nhật
                        SqlParameter paramMaTVCu2 = new SqlParameter(DTO_ThanhVienQuanHe.MATVMOI, checkNull(tvqh.MaTvCu));
                        SqlParameter paramMaTVMoi2 = new SqlParameter(DTO_ThanhVienQuanHe.MATVCU, checkNull(tvqh.MaTvMoi));
                        SqlParameter paramMaLoaiQH2 = new SqlParameter(DTO_LoaiQuanHe.MAQUANHE, checkNull(tvqh.MaLoaiQH));
                        result = data.updateFormProcedure("insertThanhVienQuanHe", paramMaTVMoi2, paramMaTVCu2, paramMaLoaiQH2);
                        if (tvqh.MaTvCu.HasValue)
                        {
                            result = this.updateKetHonOfThanhVien(tvqh.MaTvCu.Value, true);
                        }
                        if (tvqh.MaTvMoi.HasValue)
                        {
                            result = this.updateKetHonOfThanhVien(tvqh.MaTvMoi.Value, true);
                        }
                    }
                }
                
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message,ex);
            }
            return result;
            
        }
        public bool insertThanhVienThanhTich(List<DTO_ThanhVienThanhTich> list)
        {
            bool result = false;
            try
            {
                foreach (DTO_ThanhVienThanhTich tvtt in list)
                {
                    SqlParameter pMaTV = new SqlParameter(DTO_ThanhVienThanhTich.MATV, checkNull(tvtt.MaTV));
                    SqlParameter pMaLoaiTT = new SqlParameter(DTO_ThanhVienThanhTich.MALOAITHANHTICH, checkNull(tvtt.MaLoaiThanhTich));
                    SqlParameter pNgayPhatSinh = new SqlParameter(DTO_ThanhVienThanhTich.NGAYPHATSINH, checkNull(tvtt.NgayPhatSinh));
                    result = data.updateFormProcedure("insertThanhVienThanhTich", pMaTV, pMaLoaiTT, pNgayPhatSinh);
                }

            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message, ex);
            }
            return result;
        }
        public DataTable getQuanHeOfThanhVien(int maTV2)
        {
            DataTable table = new DataTable();
            try
            {
                String sql = "getQuanHeOfThanhVien";
                SqlParameter p1 = new SqlParameter(DTO_ThanhVienQuanHe.MATVMOI, maTV2);
                table = data.getDateTableFormProcedure(sql,p1);
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message,ex);
            }
            return table;
        }
        public DataTable getThanhTichOfThanhVien(int maTV)
        {
            DataTable table = new DataTable();
            try
            {
                String sql = "getThanhTichOfThanhVien";
                SqlParameter p1 = new SqlParameter(DTO_ThanhVien.MATHANHVIEN, maTV);
                table = data.getDateTableFormProcedure(sql, p1);
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message, ex);
            }
            return table;
        }
        public bool updateThanhVien(DTO_ThanhVien tv)
        {
            bool result = false;
            try
            {
                String sql = "updateThanhVien";
                SqlParameter paramTenTV = new SqlParameter(DTO_ThanhVien.TENTHANHVIEN, checkNull(tv.TenTV));
                SqlParameter paramDiaChi = new SqlParameter(DTO_ThanhVien.DIACHI, checkNull(tv.DiaChi));
                SqlParameter paramNgaySinh = new SqlParameter(DTO_ThanhVien.NGAYSINH, checkNull(tv.NgaySinh));
                SqlParameter paramDoi = new SqlParameter(DTO_ThanhVien.DOI, checkNull(tv.Doi));
                SqlParameter paramNgayPhatSinh = new SqlParameter(DTO_ThanhVien.NGAYPHATSINH, checkNull(tv.NgayPhatSinh));
                SqlParameter paramMaNgheNghiep = new SqlParameter(DTO_ThanhVien.MANGHENGHIEP, checkNull(tv.MaNgheNghiep));
                SqlParameter paramMaQueQuan = new SqlParameter(DTO_ThanhVien.MAQUEQUAN, checkNull(tv.MaQueQuan));
                SqlParameter paramMaDDMaiTang = new SqlParameter(DTO_ThanhVien.MADDMAITANG, checkNull(tv.MaDDMaiTang));
                SqlParameter paramMaNguyenNhan = new SqlParameter(DTO_ThanhVien.MANGUYENNHAN, checkNull(tv.MaNguyenNhan));
                SqlParameter paramGioiTinh = new SqlParameter(DTO_ThanhVien.GIOITINH, checkNull(tv.GioiTinh));
                SqlParameter paramHinhAnh = new SqlParameter(DTO_ThanhVien.HINHANH, checkNull(tv.HinhAnh));
                SqlParameter paramNgayGioMat = new SqlParameter(DTO_ThanhVien.NGAYGIOMAT, checkNull(tv.NgayGioMat));
                SqlParameter paramDaMat = new SqlParameter(DTO_ThanhVien.DAMAT, checkNull(tv.DaMat));
                SqlParameter paramDaKetHon = new SqlParameter(DTO_ThanhVien.DAKETHON, checkNull(tv.DaKetHon));
                SqlParameter paramMaTv = new SqlParameter(DTO_ThanhVien.MATHANHVIEN, checkNull(tv.MaTV));

                result = data.updateFormProcedure(sql, paramTenTV, paramDiaChi, paramNgaySinh, paramDoi,
                                 paramNgayPhatSinh, paramMaNgheNghiep, paramMaQueQuan, paramMaDDMaiTang,
                                 paramMaNguyenNhan, paramGioiTinh, paramHinhAnh, paramNgayGioMat, paramDaMat, paramDaKetHon, paramMaTv);
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message, ex);
            }
            return result;
        }
        public bool XoaQuanHeThanhTichOfThanhVien(int MaTV)
        {
            bool result = false;
            try
            {
                DTO_ThanhVienQuanHe tvqh = getThanhVienQuanHe(MaTV);
                if (tvqh.MaTvCu.HasValue)
                {
                    result = this.updateKetHonOfThanhVien(tvqh.MaTvCu.Value, null);
                }
                if (tvqh.MaTvMoi.HasValue)
                {
                    result = this.updateKetHonOfThanhVien(tvqh.MaTvMoi.Value, null);
                }

                string sql = "deleteQuanHe_ThanhTich_OF_ThanhVien";
                SqlParameter p1 = new SqlParameter(DTO_ThanhVien.MATHANHVIEN, MaTV);
                result = data.updateFormProcedure(sql, p1);
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message,ex);
            }
            return result;
        }
        public bool XoaThanhVien(int MaTV)
        {
            bool result = false;
            try
            {
                string sql = "deleteThanhVien";
                SqlParameter p1 = new SqlParameter(DTO_ThanhVien.MATHANHVIEN, MaTV);
                result = data.updateFormProcedure(sql, p1);
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message, ex);
            }
            return result;
        }
        public bool updateKetHonOfThanhVien(int maTV, bool? isKetHon)
        {
            bool result = false;
            string strKetHon = "null";
            if (isKetHon.HasValue)
            {
                strKetHon = isKetHon.Value == true ? "1" : "0";
            }
           
            try
            {
                String sql = "UPDATE " + DTO_ThanhVien.TB_Name
                    + " SET " + DTO_ThanhVien.DAKETHON + "= " + strKetHon 
                    + " WHERE " + DTO_ThanhVien.MATHANHVIEN + "=@" + DTO_ThanhVien.MATHANHVIEN;
               // SqlParameter p1 = new SqlParameter(DTO_ThanhVien.DAKETHON, isKetHon);
                SqlParameter p2 = new SqlParameter(DTO_ThanhVien.MATHANHVIEN, maTV);
                result = data.executeUpdate(sql,p2);
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message,ex);
            }
            return result;
        }
        public DTO_ThanhVienQuanHe getThanhVienQuanHe(int maTv)
        {
            DTO_ThanhVienQuanHe dto = new DTO_ThanhVienQuanHe();
            try
            {
                string sql = "SELECT * FROM " + DTO_ThanhVienQuanHe.TB_NAME 
                                + " WHERE " + DTO_ThanhVienQuanHe.MATVMOI + "=@" + DTO_ThanhVienQuanHe.MATVMOI
                                + " AND " + DTO_LoaiQuanHe.MAQUANHE + "=2";
                SqlParameter p1 = new SqlParameter(DTO_ThanhVienQuanHe.MATVMOI,maTv);
                DataTable dt = data.executeGetDataTable(sql, p1);
                if (dt.Rows.Count > 0)
                {
                    dto.Id = Convert.ToInt16(dt.Rows[0][DTO_ThanhVienQuanHe.ID]);
                    dto.MaTvCu = checkValue(dt.Rows[0][DTO_ThanhVienQuanHe.MATVCU]);
                    dto.MaTvMoi = checkValue(dt.Rows[0][DTO_ThanhVienQuanHe.MATVMOI]);
                    dto.MaLoaiQH = checkValue(dt.Rows[0][DTO_LoaiQuanHe.MAQUANHE]);
                }
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message, ex);
            }
            return dto;
        }
    }
}
